﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

namespace GestorDeFlotasDesktop.Modelo
{
    public static class Modelo
    {
        //public static System.Data.SqlClient.SqlConnection con;
        public const string con_str = "Data Source=localhost\\SQLSERVER2005; Initial Catalog=GD1C2012; User ID = gd; Password = gd2012";

        public static SqlConnection createConnection()
        {
            SqlConnection con = new SqlConnection();
            con.ConnectionString = con_str;
            return con;
        }

        public static void openConnection(SqlConnection con)
        {
            con.Open();
        }

        public static void closeConnection(SqlConnection con)
        {
            con.Close();
        }

    }
    

    public class User
    {
        public void getRoles()
        {
        }
    }

    public class Roles
    {
        public void getPermissions()
        {
        }
    }

    public class Permissions
    {
        public static Dictionary<string, int> PermissionsDict= new Dictionary<string,int>()
        {
            {"ABM de Cliente",1},
            {"ABM de Rol",2},
            {"ABM de Usuario",3},
            {"ABM de Auto",4},
            {"ABM de Reloj",5},
            {"ABM de Chofer",6},
            {"ABM de Turno",7},
            {"Asignación Chofer-Auto",8},
            {"Registro de Viajes",9},
            {"Rendición de Cuenta del Chofer",10},
            {"Facturación del Cliente",11},
            {"Listado Estadístico",12},
        };
    }

    public static class FormActions
    {
        public enum Actions
        {
            Alta,
            Baja,
            Modificacion
        }
    }

    public static class SqlQueries
    {
        #region Roles
        public static string getRoles = "SELECT Id_Rol as Id, Ro_Descripcion as Descripcion FROM NUNCA_TAXI.Roles;";

        public static string getEnabledRoles = "SELECT Id_Rol as Id, Ro_Descripcion as Descripcion FROM NUNCA_TAXI.Roles WHERE Ro_Habilitado = 1;";

        public static string getRolesFiltered(string filter_text)
        {
            return String.Format("SELECT Id_Rol as Id, Ro_Descripcion as Descripcion FROM NUNCA_TAXI.Roles WHERE Ro_Descripcion LIKE '%{0}%';", filter_text);
        }

        public static string getRoleById(int id)
        {
            return String.Format("SELECT Id_Rol, Ro_Descripcion, Ro_Habilitado FROM NUNCA_TAXI.Roles WHERE Id_Rol = {0};", id);
        }

        public static string deleteRole(int id)
        {
            string delete_role = String.Format("UPDATE NUNCA_TAXI.Roles SET Ro_habilitado = 0 WHERE Id_Rol = {0};", id);
            string delete_user_role = String.Format("DELETE FROM NUNCA_TAXI.UsuariosRoles WHERE Id_Rol = {0};", id);
            return String.Concat(delete_role, delete_user_role);
        }

        public static string addRole(string role)
        {
            return String.Format("INSERT INTO NUNCA_TAXI.Roles(Ro_Descripcion, Ro_Habilitado)" +
                                    " VALUES('{0}',1);", role);
        }

        public static string getRoleIdByName(string role)
        {
            return String.Format("SELECT TOP 1 Id_Rol FROM NUNCA_TAXI.Roles WHERE Ro_Descripcion = '{0}';", role);
        }

        public static string addRolePermissions(int roleId, List<int> permissions)
        {
            string insert_role_permissions = String.Empty;
            foreach (int permission in permissions)
            {
                string insert_role_permission = String.Format("INSERT INTO NUNCA_TAXI.PermisosRoles(Id_Rol, Id_Permiso)" +
                                    " VALUES ({0}, {1});", roleId, permission);
                insert_role_permissions = String.Concat(insert_role_permissions, insert_role_permission);
            }

            return insert_role_permissions;
        }

        public static string updateRole(int roleId, string roleName, List<int> permissions, bool enabled)
        {
            string update_rol_info = String.Format("UPDATE NUNCA_TAXI.Roles SET Ro_Descripcion = '{1}', Ro_Habilitado = {2} " +
                                                    "WHERE Id_Rol = {0};", roleId, roleName, Convert.ToInt32(enabled));
            string delete_roles_permissions = String.Format("DELETE FROM NUNCA_TAXI.PermisosRoles WHERE Id_Rol = {0};", roleId);
            string update_roles_permissions = String.Concat(update_rol_info, delete_roles_permissions);
            foreach (int permission in permissions)
            {
                string update_role_permission = String.Format("INSERT INTO NUNCA_TAXI.PermisosRoles(Id_Rol, Id_Permiso)" +
                                    " VALUES ({0}, {1});", roleId, permission);
                update_roles_permissions = String.Concat(update_roles_permissions, update_role_permission);
            }

            return update_roles_permissions;
        }

        public static string getRolePermissions(int roleId)
        {
            return String.Format("SELECT Id_Permiso FROM NUNCA_TAXI.PermisosRoles WHERE Id_Rol = {0};", roleId);
        }

        #endregion

        #region Users

        public static string getUsers = "SELECT Id_Usuario as Id, Us_Usuario as Usuario FROM NUNCA_TAXI.Usuarios;";

        public static string getEnabledUsers = "SELECT Id_Usuario as Id, Us_Usuario as Usuario FROM NUNCA_TAXI.Usuarios WHERE Us_habilitado = 1;";

        public static string getUsersFiltered(string filter_text)
        {
            return String.Format("SELECT Id_Usuario as Id, Us_Usuario as Usuario FROM NUNCA_TAXI.Usuarios WHERE Us_Usuario LIKE '%{0}%';", filter_text);
        }

        public static string getUserById(int id)
        {
            return String.Format("SELECT Id_Usuario, Us_Usuario, Us_Habilitado FROM NUNCA_TAXI.Usuarios WHERE Id_Usuario = {0};", id);
        }

        public static string getUserIdByUsername(string username)
        {
            return String.Format("SELECT Id_Usuario FROM NUNCA_TAXI.Usuarios WHERE Us_Usuario = '{0}';", username);
        }

        public static string deleteUser(int id)
        {
            return String.Format("UPDATE NUNCA_TAXI.Usuarios SET Us_Habilitado = 0 WHERE Id_Usuario = {0};", id);
        }

        public static string getUserRoles(int userId)
        {
            return String.Format("SELECT Rol.Id_Rol as Id, Rol.Ro_Descripcion as Descripcion, " +
	                                    "ISNULL((SELECT 1 FROM NUNCA_TAXI.UsuariosRoles " +
		                                    "WHERE Id_Rol = Rol.Id_Rol " +
		                                    "AND Id_usuario = {0}), 0) as Habilitado " +
                                    "FROM NUNCA_TAXI.Roles Rol;", userId);
        }

        public static string addUser(string user, string passwd)
        {
            return String.Format("INSERT INTO NUNCA_TAXI.Usuarios(Us_Habilitado, Us_Usuario, Us_Password)" +
                                    " VALUES(1,'{0}','{1}');", user, Login.Login.getSHA256(passwd));
        }

        public static string addUserRoles(int userId, List<int> roles)
        {
            string insert_user_roles = String.Empty;
            foreach (int role in roles)
            {
                string insert_user_role = String.Format("INSERT INTO NUNCA_TAXI.UsuariosRoles(Id_Usuario, Id_Rol)" +
                                    " VALUES ({0}, {1});",userId, role);
                insert_user_roles = String.Concat(insert_user_roles, insert_user_role);
            }

            return insert_user_roles;
        }

        public static string updateUser(int userId, string passwd, List<int> roles)
        {
            string update_user = String.Empty;
            if (!String.IsNullOrEmpty(passwd))
            {
                update_user = String.Format("UPDATE NUNCA_TAXI.Usuarios SET Us_Password = '{0}' " +
                                                    "WHERE Id_Usuario = {1};", passwd, userId);
            }

            string delete_user_roles = String.Format("DELETE FROM NUNCA_TAXI.UsuariosRoles WHERE Id_Usuario = {0};", userId);
            string update_user_roles = String.Concat(update_user, delete_user_roles);
            foreach (int role in roles)
            {
                string update_user_role = String.Format("INSERT INTO NUNCA_TAXI.UsuariosRoles(Id_Usuario, Id_Rol)" +
                                    " VALUES ({0}, {1});", userId, role);
                update_user_roles = String.Concat(update_user_roles, update_user_role);
            }

            return update_user_roles;
        }

        public static string getUserInfo(string user)
        {
            return String.Format("SELECT Us_Usuario, Us_Password, Us_Login_Failed, Us_Habilitado FROM NUNCA_TAXI.Usuarios WHERE Us_Usuario = '{0}';",user);
        }

        public static string resetLoginFails(string user)
        {
            return String.Format("UPDATE NUNCA_TAXI.Usuarios SET Us_Login_Failed = 0 WHERE Us_Usuario = '{0}'", user);
        }

        public static string disableUser(string user)
        {
            return String.Format("UPDATE NUNCA_TAXI.Usuarios SET Us_Habilitado = 0 WHERE Us_Usuario = '{0}'", user);
        }

        public static string incUserLoginFailed(string user, int fails)
        {
            return String.Format("UPDATE NUNCA_TAXI.Usuarios SET Us_Login_Failed = {1} WHERE Us_Usuario = '{0}'", user, fails);
        }

        #endregion
        
        #region Auto

        public static string getAutoFiltered(int marca, string modelo, string patente, string licencia, int reloj){            
            string marca_where = String.Empty;
            string modelo_where = String.Empty;
            string patente_where = String.Empty;
            string licencia_where = String.Empty;
            string reloj_where = String.Empty;

            string auto_filtered =  "SELECT T.Id_Taxi as ID, MT.Ma_NombreTaxi as Marca, T.Ta_Modelo as Modelo, T.Ta_Patente as Patente, T.Ta_Licencia as Licencia, (MR.Ma_NombreReloj + ' - ' + R.Re_Modelo) as Reloj " +
                                    "FROM NUNCA_TAXI.Taxis T, NUNCA_TAXI.MarcasReloj MR, NUNCA_TAXI.MarcasTaxi MT, NUNCA_TAXI.Relojes R " +
                                    "WHERE T.Id_MarcaTaxi = MT.Id_MarcaTaxi AND T.Id_Reloj = R.Id_Reloj AND R.Id_MarcaReloj = MR.Id_MarcaReloj";
 
            if (marca != -1)
            {
                marca_where = String.Format(" AND T.Id_MarcaTaxi = {0}", Convert.ToInt32(marca));
                auto_filtered = String.Concat(auto_filtered, marca_where);
            }
            if (!String.IsNullOrEmpty(modelo))
            {
                modelo_where = String.Format(" AND T.Ta_Modelo LIKE '%{0}%'", modelo);
                auto_filtered = String.Concat(auto_filtered, modelo_where);
            }
            if (!String.IsNullOrEmpty(patente))
            {
                patente_where = String.Format(" AND T.Ta_Patente LIKE '%{0}%'", patente);
                auto_filtered = String.Concat(auto_filtered, patente_where);
            }
            if (!String.IsNullOrEmpty(licencia))
            {
                licencia_where = String.Format(" AND T.Ta_Licencia LIKE '%{0}%'", licencia);
                auto_filtered = String.Concat(auto_filtered, licencia_where);
            }
            if (reloj != -1)
            {
                reloj_where = String.Format(" AND T.Id_Reloj = {0}", Convert.ToInt32(reloj));
                auto_filtered = String.Concat(auto_filtered, reloj_where);
            }

            auto_filtered = String.Concat(auto_filtered, ";");
            return auto_filtered;
        
        }

        public static string getAutos()
        {
            return "SELECT T.Id_Taxi as ID, MT.Ma_NombreTaxi as Marca, T.Ta_Modelo as Modelo, T.Ta_Patente as Patente, T.Ta_Licencia as Licencia, (MR.Ma_NombreReloj + ' - ' + R.Re_Modelo) as Reloj " +
                                    "FROM NUNCA_TAXI.Taxis T, NUNCA_TAXI.MarcasReloj MR, NUNCA_TAXI.MarcasTaxi MT, NUNCA_TAXI.Relojes R " +
                                    "WHERE T.Id_MarcaTaxi = MT.Id_MarcaTaxi AND T.Id_Reloj = R.Id_Reloj AND R.Id_MarcaReloj = MR.Id_MarcaReloj;";
        }

        public static string getAutosComplete = "SELECT T.Id_Taxi as ID, MT.Ma_NombreTaxi as Marca, T.Ta_Modelo as Modelo, T.Ta_Patente as Patente, T.Ta_Licencia as Licencia, (MR.Ma_NombreReloj + ' - ' + R.Re_Modelo) as Reloj, T.Ta_Rodado as Rodado, T.Ta_Habilitado as Habilitado " +
                                    "FROM NUNCA_TAXI.Taxis T, NUNCA_TAXI.MarcasReloj MR, NUNCA_TAXI.MarcasTaxi MT, NUNCA_TAXI.Relojes R " +
                                    "WHERE T.Id_MarcaTaxi = MT.Id_MarcaTaxi AND T.Id_Reloj = R.Id_Reloj AND R.Id_MarcaReloj = MR.Id_MarcaReloj;;";

        public static string getEnabledAutos = "SELECT T.Id_Taxi as ID, MT.Ma_NombreTaxi as Marca, T.Ta_Modelo as Modelo, T.Ta_Patente as Patente, T.Ta_Licencia as Licencia, (MR.Ma_NombreReloj + ' - ' + R.Re_Modelo) as Reloj " +
                                    "FROM NUNCA_TAXI.Taxis T, NUNCA_TAXI.MarcasReloj MR, NUNCA_TAXI.MarcasTaxi MT, NUNCA_TAXI.Relojes R " +
                                    "WHERE T.Id_MarcaTaxi = MT.Id_MarcaTaxi AND T.Id_Reloj = R.Id_Reloj AND R.Id_MarcaReloj = MR.Id_MarcaReloj AND T.Ta_Habilitado = 1;";

        public static string getAutoById(int id)
        {
            string getEnabledAutosById = "SELECT T.Id_Taxi as ID, T.Id_MarcaTaxi as Marca, T.Ta_Modelo as Modelo, T.Ta_Patente as Patente, T.Ta_Licencia as Licencia, T.Id_Reloj as Reloj, T.Ta_Rodado as Rodado, T.Ta_Habilitado as Habilitado " +
                                    "FROM NUNCA_TAXI.Taxis T " +
                                    "WHERE T.Id_Taxi = {0};";

            return String.Format(getEnabledAutosById, id);
        }

        public static string deleteAuto(int id)
        {
            return String.Format("UPDATE NUNCA_TAXI.Taxis SET Ta_Habilitado = 0 WHERE Id_Taxi = {0};", id);
        }

        public static string updateAuto(int id, int marca, int reloj, string licencia, string modelo, string patente, string rodado, bool hab)
        {
            return String.Format("UPDATE NUNCA_TAXI.Taxis SET Id_MarcaTaxi = {1}, Id_Reloj = {2} , Ta_Licencia = '{3}', Ta_Modelo = '{4}', Ta_Patente = '{5}', Ta_Rodado = '{6}', Ta_Habilitado = {7} " +
                                        "WHERE Id_Taxi = {0};", id, marca, reloj, licencia, modelo, patente, rodado, Convert.ToInt32(hab));

        }

        public static string addAuto(int marca, int reloj, string licencia, string modelo, string patente, string rodado, bool hab)
        {
            return String.Format("INSERT INTO NUNCA_TAXI.Taxis(Id_MarcaTaxi, Id_Reloj, Ta_Licencia, Ta_Modelo, Ta_Patente, Ta_Rodado, Ta_Habilitado) " +
                                        "VALUES({0}, {1}, '{2}', '{3}', '{4}', '{5}', {6})", marca, reloj, licencia, modelo, patente, rodado, Convert.ToInt32(hab));

        }

        #endregion

        #region Relojes

        public static string getEnabledRelojes = "SELECT R.Id_Reloj as Id, R.Re_Modelo as Modelo, R.Re_NoSerie as NroSerie, MR.Ma_NombreReloj as Marca " +
                            "FROM NUNCA_TAXI.Relojes R, NUNCA_TAXI.MarcasReloj MR " +
                            "WHERE R.Id_MarcaReloj = MR.Id_MarcaReloj AND R.Re_Habilitado = 1;";

        public static string getRelojes = "SELECT R.Id_Reloj as Id, R.Re_Modelo as Modelo, R.Re_NoSerie as NroSerie, MR.Ma_NombreReloj as Marca " +
                    "FROM NUNCA_TAXI.Relojes R, NUNCA_TAXI.MarcasReloj MR " +
                    "WHERE R.Id_MarcaReloj = MR.Id_MarcaReloj;";


        public static string getRelojFiltered(int marca, string modelo, string nro_serie){            
            string marca_where = String.Empty;
            string modelo_where = String.Empty;
            string nro_serie_where = String.Empty;

            string reloj_filtered = "SELECT R.Id_Reloj as Id, R.Re_Modelo as Modelo, R.Re_NoSerie as NroSerie, MR.Ma_NombreReloj as Marca " + 
                                    "FROM NUNCA_TAXI.Relojes R, NUNCA_TAXI.MarcasReloj MR " +
                                    "WHERE R.Id_MarcaReloj = MR.Id_MarcaReloj";

            if (marca != -1)
            {
                marca_where = String.Format(" AND R.Id_MarcaReloj = {0}", Convert.ToInt32(marca));
                reloj_filtered = String.Concat(reloj_filtered, marca_where);
            }
            if (!String.IsNullOrEmpty(modelo))
            {
                modelo_where = String.Format(" AND R.Re_Modelo LIKE '%{0}%'", modelo);
                reloj_filtered = String.Concat(reloj_filtered, modelo_where);
            }
            if (!String.IsNullOrEmpty(nro_serie))
            {
                nro_serie_where = String.Format(" AND R.Re_NoSerie LIKE '%{0}%'", nro_serie);
                reloj_filtered = String.Concat(reloj_filtered, nro_serie_where);
            }

            reloj_filtered = String.Concat(reloj_filtered, ";");
            return reloj_filtered;
        
        }

        public static string getRelojById(int id)
        {
            return String.Format("SELECT R.Re_Habilitado as Habilitado, R.Re_Fecha_Ver as FecVerific, R.Re_Modelo as Modelo, R.Re_NoSerie as NroSerie, R.Id_MarcaReloj as Marca " +
                    "FROM NUNCA_TAXI.Relojes R " +
                    "WHERE R.Id_Reloj = {0};", id);
        }

        public static string addReloj(int id_marca_reloj, string modelo, string nroserie, DateTime verific, bool hab)
        {
            return String.Format("INSERT INTO NUNCA_TAXI.Relojes(Id_MarcaReloj, Re_modelo, Re_NoSerie, Re_Habilitado, Re_Fecha_Ver) " +
                            "VALUES({0}, '{1}', '{2}', {3}, '{4}');", id_marca_reloj, modelo, nroserie, Convert.ToInt32(hab), String.Format("{0:d/M/yyyy HH:mm:ss}", verific));
        }

        public static string deleteReloj(int id)
        {
            return String.Format("UPDATE NUNCA_TAXI.Relojes SET Re_Habilitado = 0 WHERE Id_Reloj = {0};", id);
        }

        public static string updateReloj(int id, int id_marca_reloj, string modelo, string nroserie, DateTime verific, bool hab)
        {
            return String.Format("UPDATE NUNCA_TAXI.Relojes SET Id_MarcaReloj = {0}, Re_modelo = '{1}', Re_NoSerie = '{2}', Re_Habilitado = {3}, Re_Fecha_Ver = '{4}' " +
                                    "WHERE Id_Reloj = {5};", id_marca_reloj, modelo, nroserie, Convert.ToInt32(hab), String.Format("{0:d/M/yyyy HH:mm:ss}", verific), id);
        }

        #endregion

        #region MarcasTaxi

        public static string getMarcasTaxi()
        {
            return "SELECT Id_MarcaTaxi as Id, Ma_NombreTaxi as Marca FROM NUNCA_TAXI.MarcasTaxi;";
        }

        #endregion

        #region MarcasReloj

        public static string getMarcasReloj()
        {
            return "SELECT Id_MarcaReloj as Id, Ma_NombreReloj as Marca FROM NUNCA_TAXI.MarcasReloj;";
        }

        public static string getMarcaModeloReloj()
        {
            return "SELECT R.Id_Reloj as Id, (MR.Ma_NombreReloj + ' - ' + R.Re_Modelo) as Marca " +
                "FROM NUNCA_TAXI.Relojes R, NUNCA_TAXI.MarcasReloj MR WHERE R.Id_MarcaReloj = MR.Id_MarcaReloj;";
        }


        #endregion
    
        public static string addACA(DateTime fecha, int auto_id, int chofer_id, int turno_id)
        {
            return String.Format("INSERT INTO NUNCA_TAXI.ChoferesTurnosTaxis(Id_Chofer, Id_Turno, Id_Taxi, Fecha) " +
                                    " VALUES({2},{3},{1},'{0}');",String.Format("{0:d/M/yyyy}", fecha), auto_id,chofer_id,turno_id);
        }

        public static string getClientes = "SELECT Id_Cliente as Id, (Cl_Nombre + ' - ' + Cl_Apellido) as Cliente FROM NUNCA_TAXI.Clientes;";

        public static string getFacturas(int id_cliente, DateTime ini, DateTime fin)
        {
            return String.Format("SELECT (Ch.Ch_Nombre + ' - ' + Ch.Ch_Apellido) as Chofer, V.Vi_Cant_Fichas as CantidadFichas, V.Vi_Importe as Importe, V.Vi_Fecha as Fecha, T.Tu_Descripcion as Turno " +
                                        "FROM NUNCA_TAXI.Choferes Ch, NUNCA_TAXI.Viajes V, NUNCA_TAXI.Turnos T " +
                                        "WHERE V.Id_Chofer = Ch.Id_Chofer AND V.Id_Turno = T.Id_Turno AND V.Id_Cliente = {0} AND V.Vi_Fecha <= '{1}' AND V.Vi_Fecha >= '{2}' AND Vi_FFactura_Ini IS NULL AND Vi_FFactura_Fin IS NULL ;", id_cliente, String.Format("{0:d/M/yyyy HH:mm:ss}", fin), String.Format("{0:d/M/yyyy HH:mm:ss}", ini));
        }

        public static string updateFacturas(int id_cliente, DateTime ini, DateTime fin)
        {
            return String.Format("UPDATE NUNCA_TAXI.Viajes SET Vi_FFactura_Ini = '{2}', Vi_FFactura_Fin = '{1}' WHERE Id_Cliente = {0};", id_cliente, String.Format("{0:d/M/yyyy HH:mm:ss}", fin), String.Format("{0:d/M/yyyy HH:mm:ss}", ini));

        }

        public static string getTaxiMellizo(string patente, string licencia, int reloj)
        {
            return String.Format("SELECT 1 " +
                        "FROM NUNCA_TAXI.Taxis T " +
                        "WHERE Ta_Patente = '{0}' AND Ta_Licencia = '{1}' AND Id_Reloj = {2}", patente, licencia, reloj);
        }

        public static string getRelojUsado(int reloj)
        {
            return String.Format("SELECT 1 " +
                        "FROM NUNCA_TAXI.Taxis T " +
                        "WHERE Id_Reloj = {0} AND Ta_Habilitado = 1;", reloj);
        }

        public static string getFecAutCho(DateTime fecha, int autoId, int choferId)
        {
            return String.Format("SELECT 1 " +
                        "FROM NUNCA_TAXI.ChoferesTurnosTaxis " +
                        "WHERE Id_Chofer = {0} AND Id_Taxi = {1} AND Fecha = '{2}';", choferId, autoId, String.Format("{0:d/M/yyyy}", fecha));
        }
        

    }
}
